package network

import (
	"context"
	"fmt"

	"gitee.com/doraemon1996/bunny/structure"
)

// 网络监听器
type Listener interface {
	ID() uint64               // 获取监听器唯一ID
	Context() context.Context // 获取监听器的Context
	RawListener() any         // 获取底层监听器
	Type() ListenerType       // 获取连接类型
	String() string           // 监听器主要描述信息
	Status() StatusType       // 获取连接状态

	Start(OnConnect)
	Stop()
}

// 网络监听器基类
type listener struct {
	ctl structure.Control

	// 创建Listener时赋值的字段
	id      uint64 // 监听器唯一ID
	network string // 网络类型
	address string // 监听地址
}

// 获取监听器唯一ID
func (ln *listener) ID() uint64 {
	return ln.id
}

// 获取Context
func (ln *listener) Context() context.Context {
	return ln.ctl.Context()
}

// 获取连接状态
func (ln *listener) Status() StatusType {
	switch ln.ctl.Status() {
	case structure.ControlStatus_Uninitialized:
		return Status_Uninit
	case structure.ControlStatus_Initialized:
		return Status_Init
	case structure.ControlStatus_Opening:
		return Status_Opening
	default:
		return Status_Closed
	}
}

// 获取监听器概况
func (ln *listener) String() string {
	return fmt.Sprintf("Listener[%X][%s://%s]", ln.id, ln.network, ln.address)
}
